package bibliOnline.db;

import bibliOnline.util.details.BookData;
import bibliOnline.util.details.UserDetails;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Map;

/**
 *
 * @author prova
 */
public class LoanManager {
    
     public static void loan(UserDetails user, String customer, String books) throws Exception {

        // Divido le id dei vari libri
        String[] splittedBooks = books.split(" ");
        int[] book_id = new int[splittedBooks.length];
        String sql = "";

        for (int i = 0; i < splittedBooks.length; ++i) {

            // Controllo se l'utente è bibliotecario
            if (!user.getType().equals("LIBRARIAN")) {
                throw new Exception("Per poter prenotare occorre essere bibliotecari!");
            }

            // Controllo se il codice è numerico e assegno
            book_id[i] = Integer.parseInt(splittedBooks[i]);

            // Aggiorno la stringa di insert
            if (sql.equals("")) {
                sql += "insert into loan_in_progress (username, book_id) values ('" + customer + "', " + book_id[i] + ")";
            } else {
                sql += ", ('" + customer + "', " + book_id[i] + ")";
            }
        }

        // Aggiorno il db
        PreparedStatement statement = DBConnection.prepareStatement(sql);
        statement.executeUpdate();
        statement.close();
    }

    public static ArrayList<BookData> loadBooksOnLoan(UserDetails user) throws Exception {
        // Controllo se l'utente è registrato
        if (user == null) {
            throw new Exception("Non sei registrato!");
        }

        PreparedStatement pst;
        ResultSet rs;
        ArrayList<BookData> bookList = new ArrayList(2);
        String sql = "select book.book_id, title, author, publisher, edition, genre, year, state"
                + " from loan_in_progress, book where loan_in_progress.BOOK_ID = book.BOOK_ID and username=?";

        pst = DBConnection.prepareStatement(sql);
        pst.setString(1, user.getUsername());
        rs = pst.executeQuery();

        // Aggiungo la lista dei libri trovati
        while (rs.next()) {
            bookList.add(new BookData(
                    rs.getInt("book_id"),
                    rs.getString("title"),
                    rs.getString("author"),
                    rs.getString("publisher"),
                    rs.getString("edition"),
                    rs.getString("genre"),
                    rs.getInt("year"),
                    rs.getString("state"),1,"",""));
        }

        return bookList;
    }

    public static void returnBook(UserDetails user, String book_id) throws Exception {

        // Controllo se l'utente è bibliotecario
        if (!user.getType().equals("LIBRARIAN")) {
            throw new Exception("Per poter prenotare occorre essere bibliotecari!");
        }

        // Controllo se il codice è numerico
        Integer.parseInt(book_id);

        PreparedStatement statement;
        String sql = "delete from loan_in_progress where book_id=?";

        statement = DBConnection.prepareStatement(sql);
        statement.setString(1, book_id);

        // Controllo se l'esecuzione ha avuto effetto
        if (statement.executeUpdate() == 0) {
            throw new Exception("Non ci sono libri in prestito con quel codice");
        }
        
        statement.close();
    }

    
    public static ArrayList<BookData> loadLoans(UserDetails user) throws Exception 
    {
        // Controllo se l'utente è registrato
        if (user == null) {
            throw new Exception("Per poter accedere alla lista occorre essere registrati!");
        }

        PreparedStatement pst;
        ResultSet rs;
        ArrayList<BookData> bookList = new ArrayList(2);
        String sql = "SELECT * from LOAN, BOOK where USERNAME=? and LOAN.BOOK_ID = BOOK.BOOK_ID";

        pst = DBConnection.prepareStatement(sql);
        pst.setString(1, user.getUsername());
        rs = pst.executeQuery();

        // Aggiungo la lista dei libri trovati
        while (rs.next()) {
            bookList.add(new BookData(
                    rs.getInt("book_id"),
                    rs.getString("title"),
                    rs.getString("author"),
                    rs.getString("publisher"),
                    rs.getString("edition"),
                    rs.getString("genre"),
                    rs.getInt("year"),
                    rs.getString("state"),
                    rs.getInt("vote"),
                    rs.getString("comment"),
                    rs.getString("USERNAME")));
        }

        return bookList;
    } 
    
    
            
    public static String insertReview(UserDetails user, Map<String, String[]> parametri) throws Exception 
    {
        // Controllo se l'utente è registrato
        if (user == null) {
            throw new Exception("Per poter accedere alla lista occorre essere registrati!");
        }
        
        String vote, text, book_id, msg_risposta="Errore";
        
        try {
	    vote= parametri.get("vote")[0];
            text= parametri.get("text_review")[0];
            book_id= parametri.get("book_id")[0];
	} catch (java.lang.NullPointerException ex) {
	    throw new Exception("Dati non inizializzati");    
        }  
        
        PreparedStatement pst;
        ArrayList<BookData> bookList = new ArrayList(2);
        String sql = "CALL ADD_VOTE_AND_COMMENT (?, ?, ?, ?)";

        pst = DBConnection.prepareStatement(sql);
        pst.setString(1, user.getUsername());
        pst.setString(2, book_id);
        pst.setString(3, vote);
        pst.setString(4, text);
        pst.executeUpdate();
        
        pst.close();
        
        msg_risposta="Inserimento del commento completato.";

        return msg_risposta;
    } 
    
    
    public static ArrayList<BookData> loadReviews(UserDetails user, Map<String, String[]> parametri) throws Exception 
    {      
        String book_id;
        
        try {
            book_id= parametri.get("book_id")[0];
	} catch (java.lang.NullPointerException ex) {
	    throw new Exception("Dati non inizializzati");    
        }  
        
        int book_int=Integer.parseInt(book_id);

        PreparedStatement pst;
        ResultSet rs;
        ArrayList<BookData> bookList = new ArrayList(2);
        String sql = "SELECT USERNAME,VOTE,COMMENT FROM TABLE(GET_VOTES_AND_COMMENTS(" + book_id +")) AS T ";

        pst = DBConnection.prepareStatement(sql);
        //pst.setInt(1, book_int);
        rs = pst.executeQuery();

        //Aggiungo la lista dei libri trovati
        while (rs.next()) {
            bookList.add(new BookData(
                    Integer.parseInt(book_id),
                    "","","","","",2000,"",
                    rs.getInt("vote"),
                    rs.getString("comment"),
                    rs.getString("USERNAME")));
        }

        return bookList;
    } 
    
    
}




